package eu.runelord.tools.dictionaries;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.Table;

/**
 * Klasa reprezentuje pojedynczą wartość w słowniku. Posiada referencję, przez
 * ID, do słownika. Implementuje interfejs {@link Serializable} oraz jest
 * zaadnotowane za pomocą {@link Entity}. Domyślną nazwą tabeli jest
 * "Dictionaries_Value".
 * 
 * @author Koziołek
 * 
 */
@Entity(name = "Dictionaries.Value")
@Table(name = "Dictionaries_Value")
public class Value implements Serializable {

	private static final long serialVersionUID = 2397743144401757582L;

	/**
	 * Reprezentuje unikalny identyfikator wartości. Domyślnie znajduje się w
	 * kolumnie "value_id"
	 */
	private Long ID;

	/**
	 * Reprezentuje identyfikator słownika do którego nalezy dana wartość.
	 * Domyślnie znajduje się w kolumnie "value_dictionary_ref" jest zależne,
	 * adnotacje {@link JoinTable} i {@link JoinColumn}, od kolumny
	 * "dictionary_id" w tabeli "Dictionaries_Dictionaries"
	 */
	private Long dictionaryId;

	/**
	 * Reprezentuje nazwę wartości. Domyślnie znajduje się w kolumnie
	 * "value_name".
	 */
	private String name;

	/**
	 * Reprezentuje opis wartości. Domyślnie znajduje się w kolumnie
	 * "value_desc".
	 */
	private String description;

	/**
	 * Metoda zwraca {@link #description| opis} wartości.
	 * 
	 * @return {@link #description| opis} wartości
	 */
	@Basic
	@Column(name = "value_desc")
	public String getDescription() {
		return description;
	}

	/**
	 * Metoda zwraca identyfikator
	 * {@link eu.runelord.tools.dictionaries.IDictionary| słownika} do którego
	 * należy zmienna.
	 * 
	 * @return identyfikator słownika.
	 */
	@Basic
	@Column(name = "value_dictionary_ref", nullable = false)
	@JoinTable(name = "Dictionaries_Dictionaries", joinColumns = @JoinColumn(referencedColumnName = "dictionary_id"))
	public Long getDictionaryId() {
		return dictionaryId;
	}

	/**
	 * Metoda zwraca {@link #ID} wartości.
	 * 
	 * @return identyfikator wartości
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "value_id")
	public Long getId() {
		return ID;
	}

	/**
	 * Metoda zwraca {@link #name| nazwę} wartości.
	 * 
	 * @return nazwa wartości
	 */
	@Basic
	@Column(name = "value_name", nullable = false)
	public String getName() {
		return name;
	}

	/**
	 * Metoda pozwala na ustawienie {@link #description| opisu} wartości.
	 * 
	 * @param description
	 *            {@link #description| opis} wartości
	 */
	public void setDescription(String description) {
		this.description = description;
	}

	/**
	 * Metoda pozwala na ustawienie
	 * {@link eu.runelord.tools.dictionaries.IDictionary| słownika} do którego
	 * należy zmienna.
	 * 
	 * @param dictionaryId
	 *            identyfikator słownika
	 */
	public void setDictionaryId(Long dictionaryId) {
		this.dictionaryId = dictionaryId;
	}

	/**
	 * Metoda ustawia {@link #ID} wartości
	 * 
	 * @param id
	 *            identyfikator wartości
	 */
	public void setId(Long id) {
		ID = id;
	}

	/**
	 * Metoda pozwala na ustawienie {@link #name| nazwy} wartości.
	 * 
	 * @param name
	 *            {@link #name| nazwa} wartości
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Konstruktor pozwala na stworzenie "pełnej" wartości z identyfikatorem,
	 * referencją do słownika, nazwą i opisem.
	 * 
	 * @param id
	 *            identyfikator wartości
	 * @param dictionaryId
	 *            referencja do słownika
	 * @param name
	 *            nazwa
	 * @param description
	 *            opis
	 */
	public Value(Long id, Long dictionaryId, String name, String description) {
		ID = id;
		this.dictionaryId = dictionaryId;
		this.name = name;
		this.description = description;
	}

	/**
	 * Konstruktor pozwala na stworzenie wartości posiadającej nazwę i opis.
	 * 
	 * @param name
	 *            nazwa wartości
	 * @param description
	 *            opis wartości
	 */
	public Value(String name, String description) {
		this.name = name;
		this.description = description;
	}

	/**
	 * Konstruktor domyślny.
	 */
	public Value() {
	}
}
